package Polymorphism;

// 运用多态，打印多种形状。
class Shape{// 无论是 三角形，还是正方形等等，它们都是图形
    // 以此作为共性抽出
    public void draw(){
        System.out.println("Shape::draw()");
    }
}
// 矩形
class Rect extends Shape{
    @Override// 当我们在子类中，重写了父类中的方法。那么父类方法中的输出语句就显得毫无意义
    // 最后都是输出子类draw方法，如果你想的话，可以删掉父类的 输出语句
    public void draw(){
        System.out.println("♦");
    }
}
// 花
class Flower extends Shape{
    @Override
    public void draw() {
        System.out.println("❀");
    }
}
//三角形
class Triangle extends Shape{
    @Override
    public void draw() {
        System.out.println("△");
    }
}

public class Test {
    public static void paint1(Shape shape){
        shape.draw();
    }

    public static void main(String[] args) {
        Rect rect = new Rect();
        Flower flower = new Flower();
        Triangle triangle = new Triangle();
        Shape[] shapes = {triangle,rect,triangle,rect,flower};
        for (Shape shape:shapes) {
            shape.draw();
        }
    }


    public static void main3(String[] args) {
        Rect rect = new Rect();
        Flower flower = new Flower();
        Triangle triangle = new Triangle();
        String[] shapes = { "triangle","rect","triangle","rect","flower"};
        for (String s:shapes) {
            if(s.equals("triangle")){
                triangle.draw();
            }else if(s.equals("rect")){
                rect.draw();
            }else{
                flower.draw();
            }
        }
    }



//    public static void paint(Shape shape){
//        shape.draw();
//    }
//    public static void main2(String[] args) {
//        Rect rect = new Rect();
//        paint(rect);
//        paint(new Rect());
//        System.out.println("=============");
//        Flower flower = new Flower();
//        paint(flower);
//        paint(new Flower());
//        System.out.println("=======");
//        paint(new Triangle());
//    }




    public static void main1(String[] args) {
        Rect rect = new Rect();
        rect.draw();// 这里是单纯，new对象，访问普通成员方法

        // 使用向上转型，重写，父类当中 draw 方法。
        // 使父类的draw有了另一种实现的方法，
        // 这种情况，被称为动态绑定。
        // 在不断重写父类draw方法，呈现draw方法的多态的实现
        // 这就是我们所说的多态
        Shape shape = new Rect();
        shape.draw();
        Shape shape1 = new Flower();
        shape1.draw();
    }

}
